import Request from '@/plugins/request'

const $http = new Request()

// 当前接口请求数
let requestNum = 0
// 请求开始拦截器
$http.requestStart = function (options) {
  if (options.load) {
    if (requestNum <= 0) {
      // 打开加载动画
      uni.showLoading({ title: '加载中', mask: true })
    }
    requestNum += 1
  }
  const { token, systemInfo } = uni.flux.store.state
  // 请求前加入token
  options.header.token = token
  options.header.platform = systemInfo.platform
  options.header.system = systemInfo.system + ' - ' + systemInfo.model

  // #ifdef MP-WEIXIN
  options.header.app = 'WEIXIN'
  // #endif

  // #ifdef H5
  options.header.app = 'H5'
  // #endif
  return options // return false 表示请求拦截，不会继续请求
}

$http.requestEnd = function (options) {
  // 判断当前接口是否需要加载动画
  if (options.load) {
    requestNum = requestNum - 1
    if (requestNum <= 0) {
      uni.hideLoading()
    }
  }
}

$http.dataFactory = async function (res) {
  // console.log('接口请求数据', {
  //   url: res.url,
  //   resolve: res.response,
  //   header: res.header,
  //   data: res.data,
  //   method: res.method
  // })
  if (res.response.statusCode && res.response.statusCode === 200) {
    let httpData = res.response.data
    if (typeof (httpData) === 'string') {
      httpData = JSON.parse(httpData)
    }
    // 判断数据是否请求成功
    // 判断数据是否请求成功
    // httpData.errCode = 600
    if (httpData.errCode === 0) {
      return Promise.resolve(httpData.data)
    } else if (httpData.errCode === 600 || httpData.errCode === 603 || httpData.errCode === 602) {
      return redirectJump(res)
    } else {
      console.error('【errCode异常：】', httpData.errCode, httpData.message)
      return uni.flux.reject(httpData.message)
    }
  } else {
    // 返回错误的结果(catch接受数据)
    if (res.response.data.errCode === 600 || res.response.data.errCode === 603 || res.response.data.errCode === 602) {
      /**
       * 603 token过期
       * 600 帐号在其他设备登录
       * 602 用户未登录
       */
      return redirectJump(res)
    }
    console.error('【接口-未知错误：】', res)
    return uni.flux.reject('未知错误')
  }
}
// 错误回调
$http.requestError = function (res) {
  // e.statusCode === 0 是参数效验错误抛出的
  // if (typeof res === 'object' && res.statusCode === 0) {
  //   console.error('未知错误：', res)
  //   throw res
  // } else {
  //   console.error('系统错误：', res)
  // }
  console.error('【接口-系统错误：】', res)
  return uni.flux.reject('系统错误')
}

function redirectJump (res) {
  console.error('【errCode 重定向：】', res.response.data.errCode, res.response.data.message)

  if (uni.flux.store.state.env.isH5 && uni.flux.store.state.env.isDev) {
    // H5本调开发不跳
    if (window.location.port === '8081') {
      // return uni.flux.reject(res.response.data.message)
    }
  }

  // 只跳一次
  if (uni.flux.store.state.isRedirect) return
  uni.flux.store.commit('setIsRedirect', true)

  if (uni.flux.store.state.env.isH5) {
    uni.flux.store.commit('setWxCode', '')
  }

  uni.flux.$api.user.logout(600)
  const { route, fullPath } = uni.flux.utils.getCurrentPageFullPath()
  if (route && uni.flux.config.mainPage.includes(route)) {
    uni.setStorageSync('navigatorUrl', route)
    uni.navigateTo({ url: '/pages/mine/login/index' })
    return uni.flux.reject(res.response.data.message)
  }
  if (fullPath) {
    uni.setStorageSync('navigatorUrl', fullPath)
    uni.navigateTo({ url: '/pages/mine/login/index' })
    return uni.flux.reject(res.response.data.message)
  } else {
    uni.navigateTo({ url: '/pages/mine/login/index' })
    return uni.flux.reject(res.response.data.message)
  }
}
export default $http
